<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div>打开控制台查看结果</div>

    <script>
        console.log('==========遍历器对象的return()、throw()========');
        /* 
            遍历器生成函数中，next()方法是必须部署的
            return()和throw()方法部署是可选的
        */

        /* return()使用的场合：
           如果for...of循环提前退出（通常是因为出错，或者有break语句）
           如果一个对象在完成遍历前，需要清理或释放资源，就可以部署return()方法。
        */
        function readLinesSync(file){
            return {
                [Symbol.iterator](){
                    return {
                        next(){
                            return {done : false}
                        },
                        return(){
                            console.log('关闭方法');
                            return {done : true}
                        }
                    }
                }
            }
        }
        // 上面代码中函数readLinesSync接受一个文件对象作为参数，返回一个遍历器对象，其中除了next()方法，还部署了return()方法。下面的两种情况，都会触发执行return()方法。
        /* 情况一 */
        for(let line of readLinesSync('hello')){
            console.log(line);  // undefined
            break  // 关闭方法
        }

        /* 情况二 */
        for(let line of readLinesSync('hello')){
            console.log(line);  // undefined
            throw new Error()  // 关闭方法
        }
    </script>
</body>
</html>